Skip to content
This repository has been archived by the owner on Sep 1, 2020. It is now read-only.

Latest commit

 

History

History
90 lines (78 loc) · 2.37 KB

3.8 - Coroutine/MySQL.md

File metadata and controls

90 lines (78 loc) · 2.37 KB

Coroutine\MySQL

启用协程MySQL客户端

  • 请勿同时使用异步回调和协程MySQL

使用示例

$swoole_mysql = new Swoole\Coroutine\MySQL();
$swoole_mysql->connect([
	'host' => '127.0.0.1',
	'port' => 3306,
	'user' => 'user',
	'password' => 'pass',
	'database' => 'test',
]);
$res = $swoole_mysql->query('select sleep(1)');

defer特性

请参考并发Client一节。

存储过程

4.0.0版本后, 支持MySQL存储过程和多结果集获取

MySQL8.0

Swoole-4.0.1或更高版本支持了MySQL8所有的安全验证能力, 可以直接正常使用客户端,而无需回退密码设定


4.0.1 以下版本

MySQL-8.0默认使用了安全性更强的caching_sha2_password插件, 如果是从5.x升级上来的, 可以直接使用所有MySQL功能, 如是新建的MySQL, 需要进入MySQL命令行执行以下操作来兼容:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
flush privileges;

将语句中的 'root'@'localhost' 替换成你所使用的用户, password 替换成其密码.

如仍无法使用, 应在my.cnf中设置 default_authentication_plugin = mysql_native_password

SQL 文件

function read_sql_file(string $file)
{
    $comment_regex = '/(?<!:)\/\/.*|\/\\*(\s|.)*?\*\/|--[^\n]+/';
    $lines = explode("\n", preg_replace($comment_regex, '', co::readFile($file)));
    $init_sql = [];
    $multi = false;
    foreach ($lines as $index => $line) {
        if (strlen($line) === 0) {
            continue;
        }
        if (substr($line, -1, 1) !== ';') {
            if (!$multi) {
                $multi = true;
                goto _new_line;
            } else {
                _append:
                $end_line = &$init_sql[count($init_sql) - 1];
                $end_line = $end_line . $line . "\n";
            }
        } else {
            if ($multi) {
                $multi = false;
                goto _append;
            } else {
                $multi = false;
                _new_line:
                $init_sql[] = "{$line}";
            }
        }
    }

    return $init_sql;
}

$sql_file = read_sql_file(__DIR__ . '/test.sql');
foreach ($sql_file as $line) {
	if (!$mysql->query($line)) {
		echo "Failed! Error#{$mysql->errno}: {$mysql->error}\n";
		exit(1);
	}
}